/**
 * 给定有向无环图，有点权，且每个点还放有Ai个碎片。做如下操作：
 * 选择某个点记作x，拿走它的一个碎片，然后选择x的邻居点集，
 * 满足SIGMA{W[邻居]} < Wx，在这些邻居上每点放一个碎片
 * 问最多能操作多少次
 * 可以看作碎片是可以复制传播的，因此一个碎片希望能够复制传播的最多
 * 对每个点，设一个碎片可以复制传播Di次，其权值是Wi
 * 则 Di = max{SIGMA{Dj, j是i的儿子，且SIGMA{Wj}不超过Wi}}
 * 将D看作收益，W看作代价，对每个点而言均是一个01背包问题
 * 求出来以后累加累乘即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using vi = vector<int>;
using pii = pair<int, int>;

int M;
int N;
vector<vi> G;
vi A;
vi W;

vector<int> D; 

llt dfs(int u){
    if(-1 != D[u]) return D[u];

    vi w; w.reserve(N);
    for(auto v : G[u]){
        if(W[u] > W[v]){
            dfs(v);
            w.push_back(v);
        }
    }

    if(w.empty()) return D[u] = 0;

    int maxv = W[u];
    vi f(maxv, 0);
    for(auto i : w){
        auto cost = W[i];
        auto gain = D[i] + 1;
        for(int v=maxv-1;v>=cost;--v){
            f[v] = max(f[v], f[v - cost] + gain);
        }
    }
    return D[u] = f[maxv-1];
}

llt proc(){ 
    D.assign(N + 1, -1);
    for(int i=1;i<=N;++i){
        dfs(i);
    }
    // for(int i=1;i<=N;++i){
    //     cout << i << ": " << D[i] << endl;
    // }
    llt ans = 0;
    for(int i=1;i<=N;++i){
        ans += (D[i] + 1LL) * A[i];
    }
    return ans;
}

void work(){
    cin >> N >> M;
    G.assign(N + 1, {});
    for(int a,b,i=0;i<M;++i){
        cin >> a >> b;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    
    W.assign(N + 1, {});
    for(int i=1;i<=N;++i) cin >> W[i];

    A.assign(N + 1, {});
    for(int i=1;i<=N;++i) cin >> A[i];
    cout << proc() << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}